home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Environments / MacMETH 3.2.4 / Examples / IFS.MOD < prev    next >
Text File  |  1996-06-20  |  2KB  |  65 lines

  1. MODULE  IFS;
  2. (* Iterated Function System, see page 92 in
  3.    Reiser, M., Wirth, N: "Programming in Oberon"  *)
  4.  
  5. IMPORT  RandomNumbers, In, Out, XYplane;
  6.  
  7. VAR
  8.     a1, b1, c1, d1, e1, f1, p1: REAL;   (* IFS parameters *)
  9.     a2, b2, c2, d2, e2, f2, p2: REAL;   (* IFS parameters *)
  10.     a3, b3, c3, d3, e3, f3, p3: REAL;   (* IFS parameters *)
  11.     a4, b4, c4, d4, e4, f4, p4: REAL;   (* IFS parameters *)
  12.     X, Y: REAL;        (* the position of the pen *)
  13.     x0: INTEGER;    (* Distance of origin fm left edge[pixels] *)
  14.     y0: INTEGER;    (* Distance of origin from bottom edge[pixels] *)
  15.     e: INTEGER;    (* Size of unit interval [pixels] *)
  16.     initialized: BOOLEAN;    (* Are parameters initialized? *)
  17.  
  18. PROCEDURE  Draw;    (* command marked for export *)
  19. VAR
  20.     x, y: REAL;                 (* new position *)
  21.     xi, eta: INTEGER;       (* pixel coordinates of pen *)
  22.     rn: REAL;
  23. BEGIN
  24. IF initialized THEN
  25.     REPEAT
  26.         rn := RandomNumbers.Uniform();
  27.         IF rn < p1 THEN
  28.             x := a1 * X + b1 * Y + e1;    y := c1 * X + d1 * Y + f1
  29.         ELSIF rn < (p1 + p2) THEN
  30.             x := a2 * X + b2 * Y + e2;    y := c2 * X + d2 * Y + f2
  31.         ELSIF rn < (p1 + p2 + p3) THEN
  32.             x := a3 * X + b3 * Y + e3;    y := c3 * X + d3 * Y + f3
  33.         ELSE
  34.             x := a4 * X + b4 * Y + e4;    y := c4 * X + d4 * Y + f4
  35.         END;
  36.         X := x;  xi := x0 + TRUNC(X*FLOAT(e));
  37.         Y := y;  eta := y0 + TRUNC(Y*FLOAT(e));
  38.         XYplane.Dot(xi, eta, XYplane.draw)
  39.     UNTIL  "s" = XYplane.Key()
  40. END
  41. END Draw;
  42.  
  43. PROCEDURE Init;    (* command marked for export *)
  44. BEGIN
  45.     X := 0.0;   Y := 0.0;        (* Initial position of pen *)
  46.     initialized := FALSE;
  47.     In.Open;
  48.     In.Int(x0);        In.Int(y0);        In.Int(e);     
  49.     In.Real(a1);    In.Real(a2); In.Real(a3);    In.Real(a4);
  50.     In.Real(b1);    In.Real(b2);    In.Real(b3);    In.Real(b4);
  51.     In.Real(c1);    In.Real(c2);    In.Real(c3);    In.Real(c4);
  52.     In.Real(d1);    In.Real(d2);    In.Real(d3);    In.Real(d4);
  53.     In.Real(e1);    In.Real(e2);    In.Real(e3);    In.Real(e4);
  54.     In.Real(f1);    In.Real(f2);    In.Real(f3);    In.Real(f4);
  55.     In.Real(p1);    In.Real(p2);    In.Real(p3);    In.Real(p4);
  56.     IF In.Done THEN XYplane.Open; initialized := TRUE 
  57.     ELSE Out.String("Parameter error"); Out.Ln
  58.     END
  59. END Init;
  60.  
  61. BEGIN  initialized := FALSE;
  62.   Init; Draw
  63. END IFS.    (* Copyright M. Reiser, 1992; modified for Modula-2 by HS *)
  64.  
  65.